package com.chang.order;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;


/**
 * springboot整合rabbitmq：
 * 1,引入amqp依赖
 * 2,添加@EnableRabbit注解
 * 3,配置amqp协议的协议端口号 及其他功能配置   spring.rabbit.XXX
 * 4, 监听消息 @RabbitListener(queues={"XXX","XXX}) 可以标注到类+方法上 可以接收指定对象的参数
 *
 * @RabbitHandler 只能标注到方法上  可以用来区分接收不同类型对象的消息
 *
 * 本地事务失效问题:
 *    同一个对象内事务方法互调默认失效,原因是绕过了代理对象,而事务就是用代理对象来进行控制的
 *    解决方法: 使用代理对象来调用事务
 *     1,使用AspectJ动态代理   添加@EnableAspectJAutoProxy(exposeProxy = true)注解  (exposeProxy = true)代表对外暴露代理对象  覆盖默认的JDK动态代理
 *     2.本类互调使用代理对象
 *
 */

@EnableAspectJAutoProxy(exposeProxy = true)
@EnableFeignClients
@EnableRedisHttpSession // 用redis封装httpSession
@EnableRabbit // 用于监听队列 不监听就不用加
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallOrderApplication.class, args);
    }

}
